# grader.py
import re
from openai import OpenAI
from typing import Tuple
from config import API_KEY, BASE_URL, MODEL_NAME
from vector_processor import KnowledgeBaseProcessor
from knowledge_graph import KnowledgeGraphProcessor


class ScoringModule:
    """评分模块，负责对用户答案进行评分和反馈。"""

    def __init__(self, knowledge_processor: KnowledgeBaseProcessor, kg_processor: KnowledgeGraphProcessor):
        self.kb_processor = knowledge_processor
        self.kg_processor = kg_processor
        self.client = OpenAI(api_key=API_KEY, base_url=BASE_URL)

    def score_answer(self, question: str, answer: str, max_score: int) -> Tuple[int, str]:
        """使用大语言模型对答案进行评分并生成反馈。"""
        # 1. 检索问题相关的标准答案上下文
        docs = self.kb_processor.retrieve_relevant_docs(question, top_k=2)
        if not docs:
            return 0, "未找到相关知识内容，无法评分。"

        context = "。\n".join([doc.page_content for doc in docs])

        # 2. 构建评分提示
        prompt = f"""
        你是一名专业的考试阅卷老师。你的任务是根据给定的问题、标准答案的知识背景和学生答案，给出分数和详细的反馈。
        请严格按照以下要求进行：
        - 满分是 {max_score} 分。
        - 评分基于学生答案与标准答案的匹配程度、逻辑清晰度、深度和完整性。
        - 反馈需要指出学生答案的优点，并详细说明扣分点。
        - 最终输出格式必须严格遵循“分数：[分数]\n反馈：[反馈内容]”的格式。
        - 评分：[分数] 必须是数字，例如：“分数：10”。
        - 反馈：[反馈内容] 必须是详细的文本，例如：“反馈：学生回答完整，逻辑清晰...”。

        问题: {question}
        标准答案知识背景: {context}
        学生答案: {answer}

        请输出你的评分和反馈：
        """

        try:
            completion = self.client.chat.completions.create(
                model=MODEL_NAME,
                messages=[
                    {"role": "user", "content": prompt}
                ],
                max_tokens=512,
                temperature=0.2
            )
            response_text = completion.choices[0].message.content.strip()

            # 3. 解析大模型的评分结果
            score_match = re.search(r'分数：(\d+)', response_text)
            feedback_match = re.search(r'反馈：(.*)', response_text, re.DOTALL)

            score = int(score_match.group(1)) if score_match else 0
            feedback = feedback_match.group(1).strip() if feedback_match else "未能生成有效的反馈。"

            return score, feedback
        except Exception as e:
            print(f"Failed to score answer: {e}")
            return 0, "评分系统出现异常，请稍后再试。"